#ifndef __BASIC_SOCKD_H__
#define __BASIC_SOCKD_H__

#include <basic/sig.h>
#include <basic/netcm.h>
#include <basic/sock.h>

__BEGIN_DECLS

#define SOCKD_MSG_SIZE      KB(32)

struct sockd_addr
{/*{{{*/
    uint32_t ip;
    uint16_t port;
};/*}}}*/

/*
 * 创建套接字
 */
extern SOCKET	/* INVALID_SOCK:失败 >=0:可用的套接字 */
sockd_create();

/*
 * 转换地址(host:port -> sockaddr_in)
 */
extern int  /* 0:成功 -1: -2: -3: */
sockd_addr_convert(
        char *saddr,            /* [IN] 显示地址 */
        struct sockd_addr *addr /* [OUT] 内部地址 */
        );

/*
 * 读套接字 
 */
extern int	/* 0:成功 -1: -2: -3: */
sockd_recvfrom(
        SOCKET sock,		    /* [IN] 套接字 */
        struct sockd_addr *peer_addr,    /* [OUT] 对方地址 */
        unsigned char *msg,		/* [IN] 读消息缓冲区 */
        int *msg_size,		    /* [OUT] 读消息大小 */
        int *p_timeout_ms       /* [IN,OUT] 超时(毫秒) 负值:无限等待 */
        );

/*
 * 写套接字 
 */
extern int	/* 0:成功 -1: -2: -3: */
sockd_sendto(
        SOCKET sock,		    /* [IN] 套接字 */
        struct sockd_addr *peer_addr,    /* [IN] 对方地址 */
        unsigned char *msg,	    /* [IN] 写消息缓冲区 */
        int *msg_size,		    /* [IN] 写消息大小 */
        int *p_timeout_ms       /* [IN,OUT] 超时(毫秒) 负值:无限等待 */
        );

/*
 * 服务端监听
 */
extern SOCKET	/* INVALID_SOCK:失败 其它:可用的套接字 */
sockd_svr_listen(
        int server_port			/* [IN] 服务器端口 */
        );

/*
 *
 */
extern SOCKET
sockd_cli_connect(
        char *peer_addr
        );

/*
 *
 */
extern int
sockd_cli_recv(
        SOCKET sock,
        unsigned char *msg,
        int *msg_size,
        int *p_timeout_ms
        );

/*
 *
 */
extern int
sockd_cli_send(
        SOCKET sock,
        unsigned char *msg,
        int *msg_size,
        int *p_timeout_ms
        );

__END_DECLS

#endif
